                           Az SQL nyelv


                             Bevezets



Rvid trtnet

  - 1974-75-ben kezdtk  a kifejlesztst  az IBM-nl, az "eredeti"
    neve SEQUEL (Structured English QUEry Language);
  - 1979-tl  tbb   cg  (pl.   IBM,  ORACLE  Corp.)  kereskedelmi
    forgalomban kaphat termkeiben;
  - 1987-tl ANSI szabvny.

Jelentsge

  - szabvny,   amelyet    jelenleg   csaknem    minden    relcis
    adatbziskezel alkalmaz (kisebb-nagyobb mdostsokkal);
  - tmr,   felhasznl   kzeli   nyelv,   alkalmas   hlzatokon
    adatbziskezel szerver s kliensek kztti kommunikcira;
  - nem   procedurlis    programozsi    nyelv    (legalbbis    a
    lekrdezseknl).

A pldkban szerepl tblk

A lers  az ORACLE  adatbziskezel SQL  dialektust ismerteti, ez
tbb-kevsb  megfelel   az  egyb   termkekben  tallhat  nyelv
variciknak. A  nyelv termk-  illetve  hardverspecifikus  elemeit
nem, vagy csak futlag ismertetjk.

Az utastsok ismertetsnl a kvetkez tblkat hasznljuk.

EMP tbla az alkalmazottak adatainak trolsra:

EMPNO ENAME    JOB        MGR HIREDATE       SAL     COMM DEPTNO

7369  SMITH    CLERK     7902 17-DEC-80   800.00              20
7499  ALLEN    SALESMAN  7698 20-FEB-81 1,600.00   300.00     30
7521  WARD     SALESMAN  7698 22-FEB-81 1,250.00   500.00     30
7566  JONES    MANAGER   7839 02-APR-81 2,975.00              20
7654  MARTIN   SALESMAN  7698 28-SEP-81 1,250.00 1,400.00     30
7698  BLAKE    MANAGER   7839 01-MAY-81 2,850.00              30
7782  CLARK    MANAGER   7839 09-JUN-81 2,450.00              10
7788  SCOTT    ANALYST   7566 21-JUL-85 3,000.00              20
7839  KING     PRESIDENT      17-NOV-81 5,000.00              10
7844  TURNER   SALESMAN  7698 08-SEP-81 1,500.00              30
7876  ADAMS    CLERK     7788 24-AUG-85 1,100.00              20
7900  JAMES    CLERK     7698 03-DEC-81   950.00              30
7902  FORD     ANALYST   7566 03-DEC-81 3,000.00              20
7934  MILLER   CLERK     7782 23-JAN-82 1,300.00              10

DEPT tbla a cg rszlegeinek adataival:

DEPTNO DNAME        LOC

    10 ACCOUNTING   NEW YORK
    20 RESEARCH     DALLAS


                                 1

    30 SALES        CHICAGO
    40 OPERATIONS   BOSTON

                        A nyelv defincija


A nyelv utastsait a kvetkez csoportokra oszthatjuk:

  -  adatler       (DDS - Data Definition Statement)
  -  adatmdost    (DMS - Data Manipulation Statements)
  -  lekrdez       (Queries)
  -  adatelrst vezrl (DCS - Data Control Statements)

A nyelvben - a szveg literlok kivtelvel - a kis- s nagybetket
nem klnbztetjk  meg. A megadott pldknl a knnyebb rthetsg
miatt a  nyelv alapszavait  csupa nagy  betvel, mg  a  programoz
sajt neveit kis betkkel rjuk.

A parancsok tbb sorba is tnylhatnak, a sorokra trdelsnek nincs
szemantikai jelentsge.  Az SQL  parancsokat a  pontosvessz zrja
le.


Lekrdezsek

A lekrdezsek ltalnos szintaxisa a kvetkez:

     SELECT  <jellemzk>
     FROM    <tblk>
     [WHERE  <logikai kifejezs>]
     [<csoportosts>]
     [<rendezs>];

A  lekrdezs  mvelete  eredmnyl  egy  jabb  tblt  llt  el
- persze lehet,  hogy az  eredmny tblnak  csak 1  oszlopa s egy
sora lesz.  Az eredmny  tbla a  lekrdezs utn megjelenik vagy a
tbla felhasznlhat pl. az adatmdost utastsokban.

A <jellemzk>  definiljk az  eredmny tbla  oszlopait,  <tblk>
adjk meg  a  lekrdezsben  rsztvev  tblk  nevt,  a  <logikai
kifejezs> segtsgvel "vlogathatunk" az eredmny sorai kztt. A
<csoportosts> az  eredmny tbla  sorait  rendezi  egyms  mell,
illetve a <rendezs> a megjelen sorok sorrendjt hatrozza meg.

Nzzk  meg,   hogy   a   lekrdezs   mveletvel   hogyan   lehet
megvalstani a relcis algebra alapmveleteit.


Vetts (projection)

A vetts  mvelete egy  tblbl adott  oszlopokat vlogat  ki.  A
<jellemzk> kztt kell felsorolni a kivnt oszlopokat. Pldul

az alkalmazottak neve s fizetse:
     SELECT ename, sal FROM emp;

minden oszlop kivlasztsa:
     SELECT * FROM emp;


                                 2

A  <jellemzk>   kz  nem   csak  a  FROM  mgtt  megadott  tbla
oszlopainak  nevt   lehet  megadni,  hanem  hasznlhatjuk  az  SQL
beptett mveleteit,  pl. egyszer  aritmetikai  kifejezseket  j
rtk ellltsra.

A dolgozk egsz ves fizetse:
     SELECT ename, 12 * sal FROM emp;

Amennyiben a dolgoz ltal kzhez kapott teljes sszeget - fizetst
s prmiumot -  egytt akarjuk megkapni, hasonlan jrhatunk el. Az
jelent csak  problmt, hogy a comm rtk nincs mindenhol kitltve,
az res  mezket nem tudjuk hozzadni a fizetshez (az res nem 0)!
Ilyenkor hasznlhatjuk  az NVL(oszlop,  rtk) fggvnyt,  amely az
res (NULL) mez helyett a megadott rtket adja vissza.

A dolgoz ltal felvett pnz:
     SELECT ename, sal + NVL(comm, 0) FROM emp;

A kivlasztott  oszlopokat  tartalmaz  tblkban  lehetnek  azonos
sorok,  ami   ellentmond   a   relcis   tblk   egyik   alapvet
kvetelmnynek. Ennek  ellenre a  SELECT utasts  nem  szri  ki
automatikusan az  azonos sorokat,  mert  ez  tlsgosan  idignyes
mvelet. A  programoznak kell tudnia, hogy az ellltott tblban
lehetnek-e (zavarnak-e)  ilyen sorok.  Ha kell,  a  kvetkezkppen
szrhetjk ki ezeket:

Az sszes klnbz munka megnevezse:
     SELECT DISTINCT job FROM emp;

Kizrs (restriction)

A kizrs  mveletnl a  tbla sorai  kzl vlogatunk. A <logikai
kifejezs> igaz  rtkeinek megfelel sorok kerlnek be az eredmny
tblba.

A 2000 dollrnl tbb fizets dolgozk:
     SELECT ename, sal FROM emp WHERE sal > 2000;

Vizsgljuk meg  a logikai  kifejezsek szerkezett.  A  kifejezsek
elemi sszetevi:

 -  literlok klnbz tps rtkekre: szmok, szveg, dtum;
 -  oszlopok nevei;
 -  a fenti elemekbl elemi adatmveletekkel kpzett kifejezsek
    szmoknl:      aritmetikai mveletek,
                    aritmetikai fggvnyek;
    szvegeknl:    SUBSTR(), INSTR(), UPPER(), LOWER(), SOUNDEX(),
    ...;
    dtumoknl:     +, -, konverzik;
 -  halmazok:       pl.: (10,20,30);
 -  zrjelek kztt egy teljes SELECT utasts (ld. ksbb).

A fenti  mveletekkel kpzett adatokbl logikai rtket a kvetkez
mveletekkel llthatunk el:

 -  relcik:                <, <=, =, !=, >=, >;
 -  intervallumba tartozs:  BETWEEN .. AND ..;
 -  NULL rtk vizsglat:    IS NULL, IS NOT NULL;


                                 3

 -  halmaz eleme:            IN <halmaz>;
 -  szveg vizsglat:
    mintval sszevets  .. LIKE <minta>, ahol
       % a tetszleges karaktersorozat,
       _ a tetszleges karakter jelzse;

Vgl a  logikai rtkeket  a zrjelezssel  illetve az AND, OR s
NOT mveletekkel lehet tovbb kombinlni. Pldk:

A 82 .. 89-es vekben felvett dolgozk:
     SELECT  ename, hiredate FROM emp
     WHERE   hiredate BETWEEN '01-JAN-82' AND '31-DEC-89';

A 2000 dollrnl kevesebbet keres s prmiumot nem kap dolgozk:
     SELECT  ename, sal FROM emp
     WHERE   sal < 2000 AND comm IS NULL;

sszekapcsols (join)

Az  termszetes   sszekapcsols  mveletnl  2  vagy  tbb  tbla
soraibl hozunk  ssze egy-egy j rekordot akkor, ha a kt sor egy-
egy mezjnek  rtke megegyezik. A SELECT kifejezsben a <tblk>-
ban kell megadni az rintett tblk neveit, a WHERE mgtti logikai
kifejezs definilja  azokat az  oszlopokat, amely  rtkei szerint
trtnik meg az sszekapcsols.

Az egyes osztlyok neve, szkhelye s a hozzjuk tartoz dolgozk:
     SELECT  dept.dname, dept.loc, emp.ename
     FROM    dept, emp
     WHERE   dept.deptno = emp.deptno;

Lthat,  hogy   mivel  mindkt   felhasznlt  tblban  azonos  az
sszekapcsolst megvalst  oszlop neve,  a WHERE-t kvet logikai
kifejezsben az  oszlop neve  mell meg kell adni a tbla nevt is.
Hasonl helyzet  elfordulhat a SELECT-et kvet <jellemzk> kztt
is.

Ha megvizsgljuk  a fenti pldban kapott eredmny, lthatjuk, hogy
a 40-es  osztly nem  szerepel a listban. Ennek az az oka, hogy az
osztlynak nincs  egyetlen dolgozja sem, teht az egyestsnl nem
talltunk az emp tblban egyetlen olyan sort sem, amelyet ehhez az
osztlyhozkapcsolhattunk  volna.   Ez  lehet   kvnatos  eredmny,
azonban az  SQL-ben lehetsg van arra is, hogy ezeket a sorokat is
egyestsk, azaz  az egyestsben  az emp  tblhoz hozzkpzeljnk
egy res sort is. Ezt kls egyestsnek hvjuk. A mdostott plda
a kvetkezkppen nz ki:

     SELECT  dept.dname, dept.loc, emp.ename
     FROM    dept, emp
     WHERE   dept.deptno = emp.deptno (+);

A (+) jel jelzi azt a tblt, amelyikhez az egyests eltt az res
mezket tartoz sort hozz kell venni.

Az egyestsnl  lehet ugyanarra  a tblra tbbszr is hivatkozni.
Pl.




                                 4

Azon dolgozk, akik tbbet keresnek a fnkknl:
     SELECT  e.ename, e.sal, m.ename, m.sal
     FROM    emp e, emp m
     WHERE   e.mgr = m.empno AND e.sal > m.sal;

A fenti  pldban ugyanazt  a tblt  ktszer is  hasznljuk, a kt
tbla oszlopainak  megklnbztetsre a  tblkat a  FROM  rszben
loklis nvvel  ltjuk el.  Loklis neveket termszetesen klnbz
tblk esetn is hasznlhatunk.

Lthat,  hogy   az  egyests   mellett  egyidejleg  ms  logikai
kifejezseket  is  hasznlhatunk.  A  fizetsek  fenti  vizsglatt
felfoghatjuk gy  is,  mint  a  termszetes  egyests  mveletnek
ltalnostott  esett,   ahol  nem  csak  az  egyenlsg  mvelete
hasznlhat  (ami   megengedett),  valamint  gy  is,  hogy  a  mr
egyestett   tblbl    zrjuk   ki    a    fizetsekre    szabott
kvetelmnyeknek    meg     nem    felel     sorokat.    Az    SQL
programoznak - ltalban - fogalma  sincs, hogyan hajtdik vgre a
fenti  kifejezs.  Itt  fedezhet  fel  a  nyelv  nem  algoritmikus
jellege.


Oszlopfggvnyek

A lekrdezs  eredmnyeknt elll  tblk egyes  oszlopaiban lv
rtkeken vgrehajthatunk  szoksos nyelven  ciklussal  kifejezhet
mveleteket, amelyek egyetlen rtket lltanak el. Ilyenek:

   AVG()     tlag
   SUM()     sszeg
   COUNT()   darabszm
   MAX()     maximlis rtk
   MIN()     minimlis rtk

Az zletktk tlagfizetse:
     SELECT AVG(sal) FROM emp WHERE job = 'SALESMAN';

Hny dolgoz van:
     SELECT COUNT(*) FROM emp;

Hny klnbz beoszts van:
     SELECT COUNT(DISTINCT job) FROM emp;

tlagos prmium:
     SELECT AVG(NVL(comm, 0)) FROM emp;

Figyelem: az  utols plda  az NVL  fggvnyt hasznlva  az  sszes
dolgozra tlagolja  a kifizetett  prmiumot, mg  NVL nlkl  csak
azokra   tlagoln,   akik   kaptak   egyltaln   prmiumot.   (Az
oszlopfggvnyek kiszmtsnl a NULL rtk rekordok kimaradnak.)

Mivel az  oszlopfggvny eredmnye  egyetlen rtket  llt el, az
oszlopfggvny mell  vagy ms  oszlopfggvnyeket  rhatunk,  vagy
olyan rtket  rhatunk,  amelyik  az  sszes  kivlasztott  sorban
azonos. Pldul rhatnnk:

     SELECT job, AVG(sal) FROM emp WHERE job = 'SALESMAN';
     SELECT COUNT(*), AVG(sal) FROM emp;


                                 5

de hibs

     SELECT COUNT(*), ename FROM emp;

Egymsba gyazott lekrdezsek

A WHERE  mgtt ll  logikai kifejezsben llhat egy teljes SELECT
utasts is. Pldul

A nem New York-ban dolgozk listja:
     SELECT ename FROM emp
     WHERE deptno IN
         (SELECT deptno FROM dept WHERE loc != 'NEW YORK')

Azaz elszr  kivlasztjuk azon osztlyok azonostjt, amelyek nem
New York-ban  vannak, majd  azt vizsgljuk, hogy az ezekbl kpzett
halmazban tallhat-e  az adott  dolgoz  osztlynak  azonostja.
Mellesleg ugyanezt  a listt megkaphatnnk az egyests mveletvel
is:

     SELECT  ename
     FROM    dept, emp
     WHERE   dept.deptno = emp.deptno AND dept.loc != 'NEW YORK';

A begyazott lekrdezs vagy egyetlen rtket - azrt mert egyetlen
megfelel   sor   egyetlen   oszlopt   vlasztottuk   ki   illetve
oszlopfggvnyt hasznltunk  -, vagy  tbb rtket  -  tbb  sort -
llt el.  Az elbbi  esetben a SELECT rtkt az elemi rtkekkel
azonos mdon  hasznlhatjuk. Tbb rtk egy halmazt jelent, teht a
halmazmveleteket  hasznlhatjuk.   A   korbban   megismert   IN()
- eleme - mvelet  mellett hasznlhat  az ANY()  illetve az  ALL()
mvelet, ahol  a kivnt  relci a  halmaz  legalbb  egy,  illetve
valamennyi rtkre igaz.

Legmagasabb fizets dolgozk (lehet, hogy tbb van!):
     SELECT  ename, sal FROM emp
     WHERE   sal >= ANY (SELECT sal FROM emp);

illetve ugyanez a plda oszlopfggvny felhasznlsval:
     SELECT  ename, sal FROM emp
     WHERE   sal = (SELECT MAX(sal) FROM emp);

Csoportosts

Az oszlopfggvnyek  a teljes kivlasztott tblra - minden sorra -
lefutnak. Gyakran  clszer lenne a kivlasztott sorokat valamilyen
szempont szerint  csoportostani s  az oszlopfggvnyeket az egsz
tbla helyett ezekre a csoportokra alkalmazni.

Foglalkozsonknti tlagfizets:
     SELECT  job, AVG(SAL) FROM emp
     GROUP BY job;

A fenti  parancs az  emp tbla  sorait a  job oszlop azonos rtkei
alapjn csoportostja.  Termszetesen  az  oszlopfgvnyek  korbbi
hasznlathoz  hasonlan   a  SELECT  <jellemz>-k  kztt  csak  a
csoportosts alapjt  kpez oszlop  neve  illetve  a  csoportokra
alkalmazott oszlopfggvnyek szerepelhetnek.


                                 6

A csoportosts utn az eredmnybl bizonyos csoportok kihagyhatk.

Foglalkozsonknti  tlagfizets  a  1000  s  3000 dollr  kztti
tartomnyban:
     SELECT job, AVG(emp) FROM emp
     GROUP BY job
     HAVING AVG(sal) BETWEEN 1000 AND 3000;

A HAVING  mgtti logikai  kifejezsben termszetesen  csak egy-egy
csoport  kzs  jellemzire  vonatkoz  rtkek  - a  csoportosts
alapjt kpez  oszlop rtke,  vagy  oszlopfggvnyek  eredmnye -
szerepelhet. Termszetesen  a csoportosts  eltt  azrt  a  WHERE
felttelek hasznlhatk.  Clszer - gyorsabb -  WHERE feltteleket
hasznlni mindenhol,  ahol csak  lehet, a  HAVING szerkezetet  csak
akkor  alkalmazni,  amikor  a  teljes  csoporttl  fgg  rtkeket
akarjuk vizsglni.


Rendezs

Az eddig trgyalt lekrdezsek eredmnyben a sorok "vletlenszer"
- a  programoz ltal  nem megadhat  - sorrendben  szerepeltek.  A
sorrendet lehet az ORDER BY ltal megadott rendezssel szablyozni.
A rendezs  tbb oszlop  rtkei szerint  is trtnhet, ilyenkor az
elszr megadott  oszlop szerint rendeznk, majd az itt ll azonos
rtkek esetben  hasznljuk  a  kvetkeznek  megadott  oszlop(ok)
rtkt. Minden  egyes oszlop  esetben  kln  meg  lehet  adni  a
rendezs  "irnyt",   amely  alap  esetben  emelked,  de  a  DESC
mdostval cskken rendezs rhat el.

A 30-as osztly dolgozi (kicsit rendezve):
     SELECT * FROM emp WHERE deptno = 30
     ORDER BY job, sal DESC;

Osztlyok szerinti tlagfizets nvekv sorrendben:
     SELECT deptno, AVG(sal) FROM emp
     GROUP BY deptno
     ORDER BY AVG(sal);

Egyb, nem rszletezett mveletek

Az  egyes  lekrdezsek  ltal  ellltott  tblk  halmazknt  is
felfoghatk, az  SQL  nyelv  ezen  tblk  kombinlsra  tartalmaz
szoksos halmazmveleteket is.

  UNION         uni
  INTERSECT     metszet
  MINUS         klnbsg

A mveleteket kt SELECT utasts kz kell rni.

Relcis  tblk   segtsgvel   le   tudunk   rni   hierarchikus
kapcsolatokat a  klnbz sorok kztt. Pldul az emp tblban az
empno s  az mgr  oszlopok rtkei  alapjn meg lehet konstrulni a
vllalati hierarchit. Erre a CONNECT BY PRIOR szerkezet szolgl.

Pldul a



                                 7

     SELECT  ename, empno, job, deptno, mgr
     FROM    emp
     CONNECT BY PRIOR empno = mgr
     START WITH ename = 'KING'
     ORDER BY deptno;

utasts kirja a dolgozk 'fjt', az elnktl kezdden.

Nem tartoznak  szorosan az  SQL nyelvhez,  de  a  legtbb  rendszer
tartalmaz   utas'tsokat,    amelyekkel   a   lekrdezsek   ltal
el'alltott tblzatok  megjelenst  - pl.  az  oszlopok  neveit,
szlessgt,     adatformtumt,      illesztst,     trdelst -
definilhatjuk.


Tblk Mdostsa

A kvetkez mveletek az adatbzis tblk mdostsra szolglnak.

j sorokat egy meglv tblba az

     INSERT INTO <tblanv> [(<oszlopnv>, ...)]
     VALUES (<kif1>, ...)

illetve az

     INSERT INTO <tblanv> [(<oszlopnv>, ...)]
     <SELECT ...>;

utastsokkal lehetsges.  Mg az  els  szerkezet  egyetlen  sort,
addig  a   msodik  a  lekrdezs  ltal  ellltott  sszes  sort
beilleszti. (Figyelem:  a tblkban  az  egyes  rekordok  sorrendje
tetszleges, gy  a beilleszts  sem felttlenl  a tbla  "vgre"
trtnik.)

Amennyiben nem  adtuk  meg  az  oszlopok  nevt,  akkor  a  - tbla
deklarlsnl megadott  sorrenben - minden  meznek  rtket  kell
adni - esetleg NULL-t -, ha viszont megadtuk egyes oszlopok neveit,
akkor  csak   azoknak  adnk   rtket,  mgpedig   a   felsorolsuk
sorrendjben, a tbbi mez NULL rtk lesz.

Az adatbziskezel  ellenrzi, hogy az egyes mezkbe ne kerlhessen
a tbla definizijval ellenttben NULL rtk.

Sorokat trlni a

     DELETE FROM <tblanv>
     [WHERE <logikai kifejezs>];

paranccsal lehet.  Ha a  WHERE hinyzik,  a tbla valamennyi sort,
egybknt a logikai kifejezs ltal kivlasztott sorokat trljk.

Sorokban mezket az

     UPDATE <tblanv>
     SET <oszlopnv> = <kifejezs>, ...
     [WHERE <logikai kifejezs>];



                                 8

paranccsal lehet. Ha a WHERE hinyzik, a parancs a tbla valamennyi
sorban mdost, egybknt csak a kivlasztott sorokban. Pldul:

az zletktknek 20% fizetsemels:
     UPDATE emp SET sal = 1.2 * sal
     WHERE job = 'SALESMAN';

A parancsban  a kifejezsben  a szoksos opertorok s fggvnyeken
fell egyes implementcik akr lekrdezst is megengednek.


Tblk, nzetek ltrehozsa


Tblk ltrehozsa

j tblkat a

     CREATE TABLE <tblanv>
         (<oszlopnv1> <tipus1> [NOT NULL], ...);

paranccsal   lehet    ltrehozni.    A    lehetsges    adattpusok
implementcikknt vltozhatnak,  ltalban a kvetkez adattpusok
megtallhatk:

  CHAR(n)     max n. karakter hossz szveg;
  LONG(n)     mint CHAR,  de hosszra ltalban nincs (nagyon nagy)
              fels korlt;
  NUMBER(w)   az eljellel egytt max w karakter szles egsz szm;
  NUMBER(w,d) w a teljes szm, d a trtrsz szlessge;
  DATE        dtum (s ltalban idpont).

Ha valamelyik  oszlop defincija tartalmazza a NOT NULL mdostt,
a megfelel mezben mindig rtk kell, hogy szerepeljen.

A felhasznlt tblk defincija a kvetkez lehet:

     CREATE TABLE emp
         (empno      NUMBER(4)    NOT NULL,
          ename      CHAR(10),
          job        CHAR(9),
          mgr        NUMBER(4),
          hiredate   DATE,
          sal        NUMBER(7,2)
          comm       NUMBER(7,2)
          deptno     NUMBER(2)    NOT NULL);
     
     CREATE TABLE dept
         (deptno     NUMBER(2)    NOT NULL,
          dname      CHAR(14),
          loc        CHAR(13));

Nzet ltrehozsa

A nzetek  olyan  virtulis  tblk,  amelyek  a  fizikai  tblkat
felhasznlva  a   trolt  adatok  ms  s  ms  logikai  modelljt,
csoportostst tkrzik. Nzetet a



                                 9

     CREATE VIEW <nzetnv> [(<oszlopnv1>, ...)]
     AS <lekrdezs>;

A  lekrdezsre   az  egyedli   megkts,   hogy   rendezst   nem
tartalmazhat. Amennyiben  nem  adunk  meg  oszlopneveket,  a  nzet
oszlopai a  SELECT utn  felsorolt oszlopok  neveivel azonosak. Meg
kell viszont  adni az  oszlopneveket, ha a SELECT szmtott rtket
is elllt. Pldul:

     CREATE VIEW dept_sal (deptno, avg_salary) AS
         SELECT deptno, AVG(sal) FROM emp
         GROUP BY deptno;

A  nzetek   a  lekrdezsekben   a   tblkkal   megegyez   mdon
hasznlhatk. Jelentsgk,  hogy az  adatok ms  modelljt fejezik
ki, felhasznlhatk  a trolt informci rszeinek elrejtsre, pl.
klnbz felhasznlk  ms  nzeteken  keresztl  szemllhetik  az
adatokat.  A   nzet  ltalban  csak  olvashat,  az  adatmdost
mveletekben  csak   akkor  szerepelhet,   hagy  egyetlen  tblbl
keletkezett s nem tartalmaz szmtott rtkeket.


Index ltrehozsa

Az indexek a tblkban keresst gyorstjk meg. Ltrehozsuk:

     CREATE [UNIQUE] INDEX <indexnv>
     ON <tblanv> (<oszlopnv1>, ...);

Az indexeket  az  adatbziskezel  a  tblk  minden  mdostsnl
felfrissti. Amennyiben  valamelyik indexet  a  UNIQUE  kulcsszval
definiltuk, a  rendszer biztostja, hogy az adott oszlopban minden
mez egyedi  rtket tartalmaz. Lehetsges tbb oszlopot egybefog,
kombinlt indexek ltrehozsra.

A lekrdezsekben  nem jelenik  meg,  hogy  a  tblhoz  tartozik-e
index,  az  indexek  a  ltrehozsuk  utn  a  felhasznl  szmra
lthatatlanok, csak  a lekrdezseket  gyorstjk. Indexeket azokra
az  oszlopokra  rdemes  definilni,  amelyek  gyakran  szerepelnek
keressekben.  Szerencss   esetben  az   adattblban   nem   kell
egyltaln keresni,  a kvnt  rekord az  index  alapjn  kzvetlen
kivlaszthat. Pl. a

     SELECT * FROM emp WHERE ename = 'JONES';

az emp  tblban keress  nlkl kivlaszthatja JONES rekordjt, ha
az ename oszlopra definiltunk indexet.


Trlsek

A fenti adatbzis objektumokat a DROP paranccsal lehet trlni.

     DROP [TABLE | VIEW | INDEX] <nv>;

Tbla defincik mdostsa

Mr ltez tblkat mdostani az


                                10

     ALTER TABLE <tblanv>
     [ADD | MODIFY] <oszlopnv> <tpus>;

paranccsal lehet,  ahol ADD  egy j, NULL rtk oszlopot illeszt a
tblhoz, mg  MODIFY  paranccsal  egy  ltez  oszlop  szlessgt
nvelhejk.


Adatelrsek szablyozsa

Az  adatbziskezel   rendszereket   tipikusan   tbb   felhasznl
hasznlja, ezzel kapcsolatban jabb problmk merlnek fel.


Jogosultsgok definilsa

A  egyes   felhasznlk  rszint  az  adatbziskezel  rendszerrel,
rszint az  egyes objektumaival  klnbz mveleteket vgezhetnek.
Ezeknek a megadsra szolglnak a GRANT utastsok. A

     GRANT [DBA | CONNECT | RESOURCES]
     TO <felhasznl>, ...
     IDENTIFIED BY <jelsz>, ...;

paracs az  egyes felhasznlk az adatabzishoz hozzfrsnek jogt
szablyozzk. A  DBA jogosultsg  az  adatbzis  adminisztrtorokat
(DataBase Administrator) definilja, akiknek korltlan jogai vannak
az  sszes  adatbzis  objektum  felett,  nem  csak  ltrehozhatja,
mdosthatja illetve  trlheti, de  befolysolhatja az  objektumok
trolsval,  hozzfrsvel   kapcsolatos  paramtreket   is.   A
RESOURCE  jogosultsggal  rendelkez  felhasznlk  ltrehozhatnak,
mdosthatnak ill.  trlhetnek  j  objektumokat,  mg  a  CONNECT
jogosultsg csak az adatbziskezelbe belpsre jogost.

Az egyes objektumokhoz - tblk ill. nzetek - a hozzfrst a

     GRANT <jogosultsg>, ...
     ON <tbla vagy nzetnv>
     TO <felhasznl>
     [WITH GRANT OPTION];

parancs hatrozza  meg.  A  <jogosultg>  az  objektumon  vgezhet
mveleteket adja meg, lehetsges rtkei:

     ALL
     SELECT
     INSERT
     UPDATE <oszlopnv>, ...
     DELETE
     ALTER
     INDEX

Az utols  kt mvelet  nzetekre nem  alkalmazhat. A  felhasznl
neve helyett  PUBLIC is  megadhat, amely  brmelyik  felhasznlra
vonatkozik. A  WITH GRANT  OPTION-nal megkapott  jogosultsgokat  a
felhasznlk tovbb is adhatjk.




                                11

Tranzakcik

Az adatbzisok  mdostsa ltalban  nem  trtnhet  meg  egyetlen
lpsben, hiszen  legtbbszr egy  mdosts  sorn  tbb  tblban
trolt informcin  is vltoztatni  akarunk, illetve egyszerre tbb
rekordban akarunk  mdostani, tbb  rekordot akarunk beilleszteni.
Elfordulhat, hogy mdosts kzben meggondoljuk magunkat, vagy ami
mg slyosabb kvetkezmnyekkel jr, hogy az adatbziskezel lell.
Ilyenkor a  trolt adatok  inkonzisztens  llapotba  kerlhetnnek,
hiszen  egyes   mdostsokat  mr   elvgeztnk,  ehhez   szorosan
hozztartoz msokat viszont mg nem.

A tranzakci  az adatbzis  mdostsainak olyan  sorozata, amelyet
vagy teljes egszben kell vgrehajtani, vagy egyetlen lpst sem.
Az adatbziskezelk  biztostjk, hogy mindig vissza lehessen trni
az  utols   teljes   egszben   vgrehajtott   tranzakci   utni
llapothoz.

Egy  folyamatban   lv  tranzakcit   vagy  a  COMMIT  utastssal
zrhatjuk le,  amely  a  korbbi  COMMIT  ta  vgrehajtott  sszes
mdostst vglegesti,  vagy a  ROLLBACK utastssal trlhetjk a
hatsukat,  visszatrve   a  megelz  COMMIT  kiadsakor  rvnyes
llapotba.

Bellthat, hogy bizonyos mveletek automatikusan COMMIT mveletet
hajtsanak vgre.

     SET AUTOCOMMIT [IMM | OFF];

Az IMM  llapotban az ALTER, CREATE, DROP, GRANT s EXIT utastsok
sikeres vgrehajtsa COMMIT-ot is jelent.

A rendszer hardver hiba utni jraindulsakor illetve hibs INSERT,
UPDATE vagy  DELETE parancs hatsra automatikusan ROLLBACK-et hajt
vgre. rdemes  ht biztonsgos  helyeken COMMIT  parancsot kiadni,
nehogy  egy   hibsan  kiadott   parancs  visszavonja   a   korbbi
mdostsokat.


Prhuzamos hozzfrsek szablyozsa

Az  adatbzist   tbb  felhasznl   egyidejleg  is  hasznlhatja.
Ilyenkor az  egyes tblkhoz  a prhuzamos  hozzfrst kln-kln
lehet szblyozni.

     LOCK TABLE <tblanv>, ...
     IN [SHARE | SHARED UPDATE| EXCLUSIVE] MODE [NOWAIT];

A  LOCK   parancsal  egy  felhasznl  megadhatja,  hogy  az  egyes
tblkhoz   ms   felhasznlknak   milyen   egyidej   hozzfrst
engedlyez. Az  utasts vgrehajtsnl a rendszer ellenrzi, hogy
a LOCK  utastsban ignyelt  felhasznlsi  md  kompatibilis-e  a
tblra  rvnyben   lv  kizrssal.   Amennyiben  megfelel,  az
utasts visszzatr  s egyb  utastsokat  lehet  kiadni.  Ha  az
ignyelt kizrs  nem engedlyezett,  az utasts vrakozik amg az
rvnyes kizrst megszntetik, ha csak a parancs nem tartalmazza a
NOWAIT mdostt.  Ebben az  esetben a LOCK utasts mindig azonnal
visszatr, de visszaadhat hibajelzst is.


                                12

A tblhoz hozzfrst az els sikeres LOCK utasts definilja.

A SHARE  mdban megnyitott  tblkat  msok  olvashatjk,  a  SHARE
UPDATE  mdban   msok  mdosthatjk   is, ilyenkor  automatikusan
klcsns  kizrs   teljesl  egy-egy   sorhoz  hozzfrsnl.  Az
EXCLUSIVE md kizrlagos hozzfrst biztost.


                             Bvtsek



Konzisztencia felttelek

A tblk  defincijnl eddig  csak azt  adhattuk meg, hogy milyen
adattpusba tartoz rtkeket lehet az egyes oszlopokban hasznlni,
illetve mely  oszlopokban kell  felttlenl  rtknek  szerepelnie.
Clszer lenne  a tblkhoz  olyan feltteleket  rendelni,  amelyek
szigorbb feltteleket  definilnak az  egyes  adatokra,  amelyeket
aztn a  rendszer a  tbla minden  mdostsnl ellenriz. Ilyenek
pldul:

  - az  egyes  adatok  rtkszletnek  az  ltalnos  adattpusnl
    pontosabb defincija  (pl. adott  intervallumba tarozs, adott
    halmazba tartozs,  ahol a  hallmaz lehet egy msik tbla egyik
    oszlopnak rtkei);
  - az oszlop elsdleges kulcs, azaz a tbla soraiban minden rtke
    klnbz (hasonl hats elrhet a UNIQUE indexxel is);
  - az oszlop idegen kulcs, azaz rtke meg kell, hogy egyezzen egy
    msik  tbla  elsdleges  kulcs  oszlopnak  valamelyik  ltez
    elemvel;

Amennyiben   a    tblk   mdostsnl    valamelyik    felttelt
megsrtennk, a  rendszer egy  kivtel jelet  (exception)  generl,
lefuttatja a hibajelhez tartoz kiszolgl utastst, ha van ilyen.


PL/SQL

A PL/SQL a nyelv olyan bvtse, amely segtsgvel

  - tbb SQL utastst ssze lehet fogni egy programm;
  - szksg  esetn   vissza  lehet   csempszni  az   algoritmikus
    porgramozs elemeit: vltozkat, vezrlsi szerkezeteket.

Az SQL SELECT utastsa tbb - elre nem lthat szm - sort llt
el, amelyet  a klasszikus  algoritmikus programozsi  nyelvek  nem
tudnak  kezelni.  A  PL/SQL  bevezette  a  kurzor  fogalmt,  amely
segtsgvel  egy   lekrdezs  ltal   ellltott  sorokon  lehet
vgigpsztzni.

Hosszas magyarzatok helyett nzznk egy pldt. A kvetkez PL/SQL
programrszlet kiszmolja  a  20-as  osztlyban  kifizetett  sszes
pnzt  (fizets   s  prmium),  megszmolja,  hogy  hnyan  kapnak
2000$-nl nagyobb  fizetst,  illetve  hny  dolgoznak  nagyobb  a
prmiuma, mint  a fizetse.  Az  erdmnyeket  egy  tmeneti  (temp)
tblba rakja.



                                13

     DECLARE
         total_wages    NUMBER := 0;
         high_paid      NUMBER := 0;
         higher_comm    NUMBER := 0;
     BEGIN
         FOR emp_record
             IN (SELECT sal, comm FROM emp WHERE deptno = 20)
         LOOP
             emp_record.comm := NVL(emp_record.comm, 0);
             total_wages := total_wages + emp_record.sal +
                     emp_record.comm;
             IF emp_record.sal > 2000
                 THEN high_paid := high_paid + 1 ENDIF;
             IF emp_record.comm > emp_record.sal
                 THEN higher_comm := higher_comm + 1 ENDIF;
         ENDLOOP;
         INSERT INTO temp VALUES (high_paid, higher_comm,
             'Total wages:' || TO_CHAR(total_wages));
         COMMIT;
     END;

Br  a   fenti  rtkeket   el  lehetne   lltani   3   fggetlen
lekrdezssel, de  a fenti  program csak egyszer halad vgig az emp
tbln, nem  hromszor, ami  nagy  tblk  esetn  jelents  futsi
idklnbsget jelenthet.



































                                14
